
package baseservergrid;

import Network.ArbitrationController;
import Network.IModeWork;
import Network.NeedActivationException;
import autorization.AutorizationTable;
import autorization.FormatException;
import autorization.Role;
import autorization.RolesTable;
import autorization.RolesTableException;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import mpiserver.IMpiServer;
import mpiserver.MpiEvent;
import mpiserver.MpiServer;
import repository.IRepository;
import repository.Repository;
import repository.exception.DataFileException;
import repository.exception.RepositoryException;
import Network.NetworkAddress;
import Network.NetworkLogic;
import Network.SlaveServerController;
import autorization.OSUsers;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JOptionPane;
import messagemanager.JMessageManager;
import mpiserver.MpiListener;
import taskmanager.*;

/**
 * Основное окно серерного приложения
 * @author Алексей ID = 2001, Volk ID = 1001
 */
public class JServerMainFrame extends javax.swing.JFrame {
    private final int WIDTH_FRAME = 750; //Ширина фрейма
    private final int HEIGHT_FRAME = 550; //Высота фрейма
    private final String MMESSAGEFILE = "MFFile.txt";
    private final String DMESSAGEFILE = "DFFile.txt";
    /**таблица авторищации*/
    private AutorizationTable autoTab = null;
    /** Таблица ролей */
    private RolesTable rolesTab = null;
    /** репозиторий */
    private IRepository repository = null;
    /** сервер MPI */
    private IMpiServer mpiserver = null;
    /** планировщик */
    private ITaskManager taskmanager = null;
    /** класс межсетевого взаимодействия */
    private NetworkLogic netLogic = null;
    /** модуль работы с системными пользователями */
    private OSUsers osUsers=null;
    /** модуль отложенных сообщений пользователя */
    private JMessageManager messageManager = null;
    // Дополнительные окна, диалоги, фреймы...
    /** окно настройки MPI сервера */
    private JMPISettingsFrame MPISettingsFrame = null;
    /** окно настройки адресов сервера */
    private JThisServerSettingsDialog ThisServerSettingsDialog = null;

    /** Creates new form JServerMainFrame */
    public JServerMainFrame() throws Exception {
        initComponents();
        // Создаём фрейм настроек
        ThisServerSettingsDialog = new JThisServerSettingsDialog(this, true);
        //настроить отображение окна
        disposeFrame();
        //Инициализировать основные модули
        if (!initModule()) { throw new Exception(); }
        msg("Загрузка завершена");
        // Создаём фрейм настроек
        MPISettingsFrame = new JMPISettingsFrame(mpiserver);
    }

    /**
     * Сконфигирурировать обработчики событии от сетевого модуля
     */
    private void configNetworkEvent(){
      //Сконфигурировать обработчик: "Переход сервера в автоматический режим работы"
      NetworkLogic.addAutomaticModeListener(new ActionListener(){
       public void actionPerformed(ActionEvent e) {
         msg("Оповещение: Изменён режим работы сервера на \"Автоматический\"");
       }

      });
      //Сконфигурировать обработчик: "Сервер стал ведомым"
      SlaveServerController ssc = netLogic.getS2S().getMySlaveController();
      ssc.addActionModeSlaveServer(new ActionListener(){
       public void actionPerformed(ActionEvent e) {
         SlaveServerController ssc = netLogic.getS2S().getMySlaveController();
         msg("Оповещение: Изменён режим работы сервера на \"Ведомый сервер\"");
         NetworkAddress address = ssc.getArbitratorAddress();
         msg("Координаты арбитра IP: " + address.getHost() + "Порт: " + address.getPort());
       }
      });

     //Сконфигурировать обработчик "Потеря связи с арбитром"
     ssc.addFailArbitratorListener(new ActionListener(){
       public void actionPerformed(ActionEvent e) {
        msg("Потеря соединения с арбитром");
       }
     });

     //Сконфигурировать обработчик "Восстановление соединение"
     ssc.addReconnectArbitratorListener(new ActionListener(){
       public void actionPerformed(ActionEvent e) {
        msg("Восстановление соединения с арбитром");
       }
     });

     //Сконфигурировать событие - сервер удалён из сети арбитром 
     ssc.addActionRemoveThisServerFromNetwork(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
       msg("Сервер удалён из вычислительной сети арбитром");
      }
     });

     //Сконфигурировать обработчик - первое вхождение ведомого сервера в сеть после запуска машины
     ssc.addActionInitNetServer(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
        msg("Выполнилось подключение сервера к вычислительной сети");
      }
     });

     //Сконфигурировать обработчик: "Сервер стал арбитром"
     ArbitrationController asc = netLogic.getS2S().getMyArbitrationController();
     asc.addModeArbitratorListener(new ActionListener(){
       public void actionPerformed(ActionEvent e) {
         msg("Оповещение: Изменён режим работы сервера на \"Арбитр\"");
       }
     });

     //Сконфигурировать обработчик: "Добавлен новый ведомый сервер"
     asc.addAddSlaveArbitratorListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
       NetworkAddress address = (NetworkAddress) e.getSource();
       msg("Сервер с параметрами, IP: " + address.getHost() + " Порт: " + address.getPort() + " стал членом вычислительной сети");
      }
     });

     //Сконфигурировать обработчик: "Удален ведомый сервер"
     asc.addRemoveServerListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
       NetworkAddress address = (NetworkAddress) e.getSource();
       msg("Удалён подчинённый сервер, IP: " + address.getHost() + " Порт: " + address.getPort());
      }
     });

     //Сконфигурировать обработчик: "Потеря соединения с ведомым сервером"
     asc.addFailServerListener(new ActionListener(){
       public void actionPerformed(ActionEvent e) {
         NetworkAddress address = (NetworkAddress) e.getSource();
         msg("Потеря соединения с ведомым сервером, IP: " + address.getHost() + " Порт: " + address.getPort());
       }
     });

     //Сконфигурировать обработчик: "Потеря соединения с ведомым сервером"
     asc.addReconnectAfterFailListener(new ActionListener(){
       public void actionPerformed(ActionEvent e) {
         NetworkAddress address = (NetworkAddress) e.getSource();
         msg("Работа сервера IP: " + address.getHost() + " порт: " + address.getPort() + "была восстановлена после сбоя");
       }
     });

     //Сконфигурировать обработчик: "Восстановление соединения с ведомым сервером"
     asc.addReconnectServerListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
       NetworkAddress address = (NetworkAddress) e.getSource();
       msg("Связь с ведомым сервером восстановлена, IP: " + address.getHost() + " Порт: " + address.getPort());
      }
     });




    }

    /**
     * Реконфигурация сети
     * @exception NeedActivationException активизация завершилась провалом, необходимо реактивизация
     */
    private void configNetwork() throws NeedActivationException{      
         //Инициализировать окно данными из lodic
         ThisServerSettingsDialog.setMyAddress(netLogic.getIP());
         ThisServerSettingsDialog.setMyPort(netLogic.getPort());
         //Если сервер является ведомым----------------------------------
         if(netLogic.getS2S().isSlave()){
          NetworkAddress address = netLogic.getS2S().getMySlaveController().getArbitratorAddress();
          ThisServerSettingsDialog.setIP(address.getHost());
          ThisServerSettingsDialog.setPort(address.getPort());
          ThisServerSettingsDialog.setArbitr(!netLogic.getS2S().isSlave());
         }
         //---------------------------------------------------------------
         //Если сервер является арбитром----------------------------------
         if(netLogic.getS2S().isArbitrator()){
          NetworkAddress[] servers = null;
          servers  = netLogic.getS2S().getMyArbitrationController().getServersList();
          ThisServerSettingsDialog.setServers(servers);
         }
         //---------------------------------------------------------------
         ThisServerSettingsDialog.setVisible(true);
         //Если пользователь нажал кнопку ок, то сохраняем результаты
         if(ThisServerSettingsDialog.getResult()){
         try{
          //Если данные обновились, сообщаем о то что они вступят в силу при перезагрузке сервера
          if(netLogic.updateAddress(ThisServerSettingsDialog.getMyAddress(), ThisServerSettingsDialog.getMyPort())){
           msg("Новая конфигурация сети вступит в силу только после перезагрузки сервера");
          }
         }catch(NeedActivationException nae){
          if(!netLogic.activation()){
           msg("Активация по порту: " + netLogic.getIP() + " завершилась неудачей");
           throw new NeedActivationException();
          }
         //Необходима реактивация
         }catch(IOException ioe){
          msg("Невозможен доступ к одному из конфигурационных файлов сети или один из них повреждён - активизация отменена");
         //Невозможно работать с файлом конфигурации
          throw new NeedActivationException();
         }
         
         
         //Обновление конфигурации арбитража
         LinkedList<NetworkAddress> list = ThisServerSettingsDialog.getServers();
         netLogic.getS2S().getMyArbitrationController().mergeServerList(list);
         try{
           netLogic.getS2S().saveAll();
         }catch(IOException ioe){
          //TODO
          //Вывести оповещение о том, что настройки не удалось сохранить из-за проблем с файлом
          msg("Ошибка при сохранении настроек межсетевого взаимодействия");
          return;
         }
        }

    }




    /**
     * настроить отображение окна
     */
    private void disposeFrame(){
        //Позиционирования фрейма по центру экрана
        setSize(WIDTH_FRAME, HEIGHT_FRAME);
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension sizeScreen = toolkit.getScreenSize();
        int xPos = (sizeScreen.width - WIDTH_FRAME) / 2;
        int yPos = (sizeScreen.height - HEIGHT_FRAME) / 2;
        setLocation(new Point(xPos, yPos));
        //установить иконку
        setIconImage(toolkit.getImage("./pict/server.png"));
    }
    
    /**
     * Инициалировать основных модулей
     * @return true - успешная инициализация, false - ошибка
     */
    private boolean initModule() {  
        //Инициализация таблицы ролей---------------------------------------
        try {
            rolesTab = new RolesTable(null);
            InitDefaultRoles();
        } catch (IOException ioe) {
            System.out.println("Ошибка чтения файла таблицы ролей");
            return false;
        } catch (URISyntaxException urie) {
            System.out.println("Синтаксическая ошибка в пути до файла с таблицей ролей");
            return false;
        } catch (FormatException frme) {
            System.out.println("Ошибка формата файла таблицы ролей");
            return false;
        }
        //Инициализация таблицы авторизации---------------------------------
        try {
            autoTab = new AutorizationTable(null);
        } catch (IOException ioe) {
            System.out.println("Ошибка чтения файла таблицы авторизации");
            return false;
        } catch (URISyntaxException urie) {
            System.out.println("Синтаксическая ошибка в пути до файла с таблицей авторизации");
            return false;
        } catch (FormatException frme) {
            System.out.println("Ошибка формата файла таблицы авторизации");
            return false;
        }
        //Инициализация модуля работы с системными пользователями--------------
        osUsers = OSUsers.getInstance();
        if(!osUsers.config()){
            msg("Ошибка: не удалось корректно считать конфигурацию скриптов"+
                    " настройки пользователей ОС");
        }else{
            //Заглушка !!!
            //osUsers.createGroup();
        }
        //Инициализация репозитория-----------------------------------------
        repository = new Repository();
        repository.initRootPath();
        try {
            repository.loadRepositoryData();
        } catch (DataFileException ex) {
            msg("Ошибка: не удалось загрузить данные о репозиториях");
        }
        try {
            repository.checkWholeness();
        } catch (RepositoryException ex) {
            msg("Ошибка: сбой при проверке целостности репозиториев");
        } catch (IOException ioe) {
            msg("Ошибка: сбой при проверке целостности репозиториев");
        }
        //Инициализация модуля mpi------------------------------------------
        mpiserver = new MpiServer(repository);
        if(!mpiserver.config())
            msg("Ошибка: не удалось корректно считать конфигурацию скриптов MPI");
        else{
            //mpiserver.startSmpd();
            //mpiserver.startTaskScaning();
        }
        mpiserver.addMpiListener(new MpiListener() {
            public void endingTask(MpiEvent e) 
            {msg("MPI: завершено выполнение задачи ID="+e.getTaskID());}
            public void errorTask(MpiEvent e)
            {msg("MPI: ошибка при запуске задачи ID="+e.getTaskID());}
        });
        //Инициализация планировщика----------------------------------------
        taskmanager=new TaskManager(mpiserver);
        if(!taskmanager.setMode(IModeWork.AUTONOMIC_MODE)){
            msg("Ошибка: не удалось инициализировать планировщик");
        }
        else taskmanager.getLocalTM().setMaxActiveCount(1);

        //Инициализация модуля отложенных сообщений пользователя
        try{
        messageManager = new JMessageManager(1000);
        messageManager.useStorage(MMESSAGEFILE, DMESSAGEFILE);
        }catch(IOException ioe){
           msg("Ошибка при инициализации модуля отложенных сообщений");
        }
        //Инициализация модуля сетевых соединений---------------------------

        boolean loopNext = false;
        try{
         netLogic = new NetworkLogic(taskmanager);
        }catch(IOException ioe){
         msg("Ошибка: не удаётся осуществить работу с одним из файлов конфигурации сети\n");
        }catch(NeedActivationException nae){ 
          loopNext = true;
          try{
          netLogic = new NetworkLogic(taskmanager);
          }catch(Exception e){}
        }
        try{
        //Инициализировать сеть (ВРЕМЕННАЯ ЗАГЛУШКА РАБОТЫ Сети по версии 0.01)
        netLogic.getClientNet().initNetwork(autoTab, rolesTab, repository, mpiserver, taskmanager,messageManager);
        }catch(IOException ioe){
         msg("Ошибка: не удаётся осуществить инициализацию клиентского сетевого модуля");
        }
        //Если программа запускается не в первый раз
        if(!loopNext) if(!netLogic.activation()){
         msg("Активизация сервера провалилась, проверьте параметры сети");
         loopNext = true; 
        } 
        while(loopNext) {
         try{
          configNetwork();
          loopNext = false;
         }catch(NeedActivationException nae){
           msg("Активация по порту " + netLogic.getPort() + " завершилась неудачей, проверьте настройки сети");
           //Если программа запускается не в первый раз
           if(!loopNext) if(!netLogic.activation()){
             msg("Активизация сервера провалилась, проверьте параметры сети");
             loopNext = true;
            }
        
         }

        }
        msg("Активация по порту " + netLogic.getPort() + " прошла успешно");
        //Инициализация планировщика----------------------------------------
        taskmanager.initNetwork(netLogic);
        //------------------------------------------------------------------

        //---------------Конфигурация событий от различных модулей сервера-----
        configNetworkEvent(); //Конфигурация событий от сетевого модуля
        //---------------------------------------------------------------------
        //Соединиться со всеми ведомыми серверами
        netLogic.getS2S().getMyArbitrationController().connectAll();
        return true;
    }
    
    /**
     * Инициализировать список ролей по умолчанию
     */
    private void InitDefaultRoles() throws IOException {
        //Регистрация роли User
        if (rolesTab.findRole("User") == null) {
            Role userRole = new Role("User");
            //Здесь должен быть список прав юзверя по умолчанию
            try {
                rolesTab.addRole(userRole);
            } catch (RolesTableException e) {}
        }

    }

    /**
     * отобразить сообщение в поле "журнал"
     * @param message передаваемое сообщение
     */
    void msg(String message){
        Date d=new Date();
        SimpleDateFormat dFormat = new SimpleDateFormat("HH:mm:ss");
        txtMsg.append("["+dFormat.format(d)+"] " + message+"\n");
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        splitMain = new javax.swing.JSplitPane();
        paneMain = new javax.swing.JTabbedPane();
        paneServers = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        paneExtra = new javax.swing.JTabbedPane();
        paneJournal = new javax.swing.JPanel();
        scrollMsg = new javax.swing.JScrollPane();
        txtMsg = new javax.swing.JTextArea();
        txtCmd = new javax.swing.JTextField();
        lblCmd = new javax.swing.JLabel();
        lblStatus = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        mainToolBar = new javax.swing.JToolBar();
        btnInfo = new javax.swing.JButton();
        mainBar = new javax.swing.JMenuBar();
        menuServer = new javax.swing.JMenu();
        menuSettings = new javax.swing.JMenu();
        itemServers = new javax.swing.JMenuItem();
        itemMpi = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Система администрирования Grid Server Admin v 0.02");
        setName("MainFrame"); // NOI18N
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        splitMain.setBorder(null);
        splitMain.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
        splitMain.setOneTouchExpandable(true);

        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Список серверов");

        javax.swing.GroupLayout paneServersLayout = new javax.swing.GroupLayout(paneServers);
        paneServers.setLayout(paneServersLayout);
        paneServersLayout.setHorizontalGroup(
            paneServersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(paneServersLayout.createSequentialGroup()
                .addGap(305, 305, 305)
                .addComponent(jLabel1)
                .addContainerGap(387, Short.MAX_VALUE))
        );
        paneServersLayout.setVerticalGroup(
            paneServersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(paneServersLayout.createSequentialGroup()
                .addGap(43, 43, 43)
                .addComponent(jLabel1)
                .addContainerGap(27, Short.MAX_VALUE))
        );

        paneMain.addTab("Серверы", paneServers);

        splitMain.setTopComponent(paneMain);

        txtMsg.setColumns(20);
        txtMsg.setEditable(false);
        txtMsg.setFont(new java.awt.Font("Tahoma", 0, 13));
        txtMsg.setRows(5);
        scrollMsg.setViewportView(txtMsg);

        javax.swing.GroupLayout paneJournalLayout = new javax.swing.GroupLayout(paneJournal);
        paneJournal.setLayout(paneJournalLayout);
        paneJournalLayout.setHorizontalGroup(
            paneJournalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(scrollMsg, javax.swing.GroupLayout.DEFAULT_SIZE, 792, Short.MAX_VALUE)
        );
        paneJournalLayout.setVerticalGroup(
            paneJournalLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(scrollMsg, javax.swing.GroupLayout.DEFAULT_SIZE, 211, Short.MAX_VALUE)
        );

        paneExtra.addTab("Журнал", paneJournal);

        splitMain.setRightComponent(paneExtra);

        lblCmd.setText(" comand>");

        lblStatus.setText(" Строка состояния");
        lblStatus.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);

        mainToolBar.setFloatable(false);
        mainToolBar.setRollover(true);

        btnInfo.setText("О проекте");
        btnInfo.setFocusable(false);
        btnInfo.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnInfo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        mainToolBar.add(btnInfo);

        menuServer.setText("Сервер");
        mainBar.add(menuServer);

        menuSettings.setText("Настройки");

        itemServers.setText("Адреса");
        itemServers.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemServersActionPerformed(evt);
            }
        });
        menuSettings.add(itemServers);

        itemMpi.setText("Mpi сервер");
        itemMpi.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itemMpiActionPerformed(evt);
            }
        });
        menuSettings.add(itemMpi);

        mainBar.add(menuSettings);

        setJMenuBar(mainBar);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(lblCmd)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txtCmd, javax.swing.GroupLayout.DEFAULT_SIZE, 734, Short.MAX_VALUE))
            .addComponent(lblStatus, javax.swing.GroupLayout.DEFAULT_SIZE, 797, Short.MAX_VALUE)
            .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 797, Short.MAX_VALUE)
            .addComponent(mainToolBar, javax.swing.GroupLayout.DEFAULT_SIZE, 797, Short.MAX_VALUE)
            .addComponent(splitMain, javax.swing.GroupLayout.DEFAULT_SIZE, 797, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(mainToolBar, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(splitMain, javax.swing.GroupLayout.DEFAULT_SIZE, 356, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtCmd, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblCmd))
                .addGap(10, 10, 10)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(2, 2, 2)
                .addComponent(lblStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Событие для пункта меню "Настроки">>"MPI сервер"
     * @param evt объект события
     */
    private void itemMpiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itemMpiActionPerformed
        msg("Настройка MPI заблокирована до лучших времен.");
        //MPISettingsFrame.setVisible(true);
    }//GEN-LAST:event_itemMpiActionPerformed

    /**
     * Событие для пункта меню "Настроки">>"Адреса"
     * @param evt объект события
     */
    private void itemServersActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itemServersActionPerformed
      try{
       configNetwork();
      }catch(NeedActivationException nae){};
    }//GEN-LAST:event_itemServersActionPerformed

    /**
     * Закрытие приложения
     * При закрытии сохранить параметры
     * @param evt
     */
    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        try {
            netLogic.getS2S().saveAll();
            messageManager.closeStorage();
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(this,
                "Ошибка в конфигурационных файлах.\nИзменения настроек не будут сохранены.",
                "Ошибка", JOptionPane.ERROR_MESSAGE);
        }
        //остановить smpd
        /*if(!mpiserver.killSmpd())
            JOptionPane.showMessageDialog(this,"Не удалось завершить сервис smpd",
                 "Ошибка", JOptionPane.ERROR_MESSAGE);*/
    }//GEN-LAST:event_formWindowClosing


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnInfo;
    private javax.swing.JMenuItem itemMpi;
    private javax.swing.JMenuItem itemServers;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JLabel lblCmd;
    private javax.swing.JLabel lblStatus;
    private javax.swing.JMenuBar mainBar;
    private javax.swing.JToolBar mainToolBar;
    private javax.swing.JMenu menuServer;
    private javax.swing.JMenu menuSettings;
    private javax.swing.JTabbedPane paneExtra;
    private javax.swing.JPanel paneJournal;
    private javax.swing.JTabbedPane paneMain;
    private javax.swing.JPanel paneServers;
    private javax.swing.JScrollPane scrollMsg;
    private javax.swing.JSplitPane splitMain;
    private javax.swing.JTextField txtCmd;
    private javax.swing.JTextArea txtMsg;
    // End of variables declaration//GEN-END:variables

}
